/*
*    Qizx/open 3.0 beta
*
* This code is the open-source version of Qizx.
* Copyright (C) 2004-2009 Axyana Software -- All rights reserved.
*
* The contents of this file are subject to the Mozilla Public License 
*  Version 1.1 (the "License"); you may not use this file except in 
*  compliance with the License. You may obtain a copy of the License at
*  http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
*  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
*  for the specific language governing rights and limitations under the
*  License.
*
* The Initial Developer of the Original Code is Xavier Franc - Axyana Software.
*
*/
using System;
namespace System.Qizx.Util
{

    /// <summary> 
    /// Simple String parsing utility.
    /// </summary>
    [Serializable]
    public class StringParser
    {
        [NonSerialized]
        protected internal string _s;
        [NonSerialized]
        protected internal int _ptr;
        [NonSerialized]
        protected internal int _end;

        [NonSerialized]
        protected internal int _latestInt; // parsed by parseInt;

        protected internal virtual void init(string input)
        {
            _s = input;
            _end = _s.Length;
            _ptr = 0;
        }

        protected internal virtual bool parseDec(int minDigitCount)
        {
            char c = currentChar();
            int cnt = 0;
            _latestInt = 0;
            for (; c >= '0' && c <= '9'; ++cnt)
            {
                _latestInt = 10 * _latestInt + c - '0';
                c = nextChar();
            }
            return (cnt >= minDigitCount);
        }

        protected internal virtual bool pick(char c)
        {
            if (currentChar() != c)
                return false;
            ++_ptr;
            return true;
        }

        protected internal virtual char nextChar()
        {
            return (_ptr >= _end - 1) ? (char)0 : _s[++_ptr];
        }

        protected internal virtual char currentChar()
        {
            return (_ptr >= _end) ? (char)0 : _s[_ptr];
        }
    }
}